//package com.ocom.payconfig.interceptor;
//
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
//import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
//import lombok.AllArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.ibatis.executor.statement.StatementHandler;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.mapping.SqlCommandType;
//import org.apache.ibatis.plugin.*;
//import org.apache.ibatis.reflection.MetaObject;
//import org.apache.ibatis.reflection.SystemMetaObject;
//import org.springframework.stereotype.Component;
//
//import javax.sql.DataSource;
//import java.lang.reflect.Method;
//import java.sql.Connection;
//import java.util.Arrays;
//import java.util.Optional;
//import java.util.Properties;
//
//@Slf4j
//@AllArgsConstructor
//@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
//@Component
//public class DataScopeInterceptor  extends AbstractSqlParserHandler implements Interceptor {
//    private DataSource dataSource;
//
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());
//        MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
//        this.sqlParser(metaObject);
//        // 先判断是不是SELECT操作 不是直接过滤
//        MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
//        if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {
//            return invocation.proceed();
//        }
//        BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
//        // 执行的SQL语句
//        String originalSql = boundSql.getSql();
//
//        DataScope dsAnnotation = isDataScope(mappedStatement.getId());
//        // 不含该注解，或者注解不开启DataScope校验
//        if (ObjectUtil.isNull(dsAnnotation) || !dsAnnotation.isDataScope()) {
//            return invocation.proceed();
//        }
//
//        // SQL语句的参数
//        Object parameterObject = boundSql.getParameterObject();
//
//        originalSql = "select * from (" + originalSql + ") temp_data_scope where temp_data_scope." + 1 + " in (" + 2 + ")";
//        metaObject.setValue("delegate.boundSql.sql", originalSql);
//        return invocation.proceed();
//    }
//
//    /**
//     * 生成拦截对象的代理
//     *
//     * @param target 目标对象
//     * @return 代理对象
//     */
//    @Override
//    public Object plugin(Object target) {
//        if (target instanceof StatementHandler) {
//            return Plugin.wrap(target, this);
//        }
//        return target;
//    }
//
//    /**
//     * mybatis配置的属性
//     *
//     * @param properties mybatis配置的属性
//     */
//    @Override
//    public void setProperties(Properties properties) {
//
//    }
//
//    /**
//     * 查找参数是否包括DataScope对象
//     *
//     * @param parameterObj 参数列表
//     * @return DataScope
//     */
////    private Boolean findDataScopeObject(Object parameterObj) {
////        if (parameterObj instanceof DataScope) {
////            return true;
////        } else if (parameterObj instanceof Map) {
////            for (Object val : ((Map<?, ?>) parameterObj).values()) {
////                if (val instanceof DataScope) {
////                    return (DataScope) val;
////                }
////            }
////        }
////        return false;
////    }
//
//    /**
//     * 校验是否含有DataScope注解
//     * @param namespace
//     * @return
//     * @throws ClassNotFoundException
//     */
//    private DataScope isDataScope(String namespace) throws ClassNotFoundException {
//        if(StrUtil.isBlank(namespace)){
//            return null;
//        }
//        //获取mapper名称
//        String className = namespace.substring(0, namespace.lastIndexOf("."));
//        //获取方法名
//        String methodName = namespace.substring(namespace.lastIndexOf(".") + 1, namespace.length());
//        //获取当前mapper 的方法
//        Method[] methods = Class.forName(className).getMethods();
//
//        Optional<Method> first = Arrays.asList(methods).stream().filter(method -> method.getName().equals(methodName)).findFirst();
//        DataScope annotation = first.get().getAnnotation(DataScope.class);
//        return annotation;
//    }
//
//
//
//}